package Screens;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;

import Botao.BotaoDeEstado;
import Botao.BotaoSimples;
import Main.GamePanel;
import Paineis.PainelDeGerenciamento;
import Towers.GerenciadorDeTorres;
import Towers.Tower;
import Utils.Constantes;
import Utils.Sprite;
import Utils.Utilidades;
import enemies.Enemy;

public class TelaJogo extends Screen {

	public static ArrayList<Tower>listasDeTorres = new ArrayList<Tower>();
	/**
	 * Lista de torres que vao estar ativas no cenario.
	 */
	public PainelDeGerenciamento painelLateral;
	/**
	 * Painel de gerenciamento de criacao de torres 
	 */

	Font font = new Font("Times New Roman", Font.BOLD, 15);
	Font fontTrocaWave = new Font("Times New Roman", Font.BOLD, 60);
	Font fontTrocaDebriefing = new Font("Times New Roman", Font.BOLD, 30);
	Font anterior;
	int contador=0;
	Tower torre;

	BufferedImage materialSelecionado;
	int tipoMaterial;
	int mouseX;
	int mouseY;
	/** variaveis para controlar o mouse dentro do painel 
	 * auxX e auxY	 */	
	int auxX;
	int auxY;
	int valor =0;
	/**
	 torre usada para ser mostrada no painel e quando confirmada 
	 vai ser debitado do dinheiro do jogador
	 depois adcionada na lista de torres do jogador
	 e depois fica nula para nao ser mais desenhada
	 */

	GerenciadorDeTorres gerenciadorDeTorreCriada;	
	//public static final int nroInimigos = 10;
	public static boolean liberouWave = false;
	//	Enemy inimigo;
	ArrayList< Sprite>listaDeSprites;
	Tower torreBasica;
	public static int lifeBase = 50;
	public final int lifeBaseMax = lifeBase;
	public boolean mouseOverGrid = false;
	public boolean inicializoConstrucao = false;
	// bruno 
	public int valorTorreParaVenda;
	public int valorTorreReparo;
	public int indiceTorreSelecionada;	
	//  variaveis da tela brifing
	public final BufferedImage telaBriefing;
//	public boolean inBriefing;
	int timerBriefing;
	final int limiteTimeBriefing = 10000;
	BotaoSimples botaoSkipBriefing;
	BotaoDeEstado botaoEstadoSom;


	final BufferedImage[] listaDeNomeDeFases;
	final String [] listaDeEndNomesFases;
	final BufferedImage[]listaDeImagemDeFases;
	final String [] listaDeEndImagemDeFases;
	boolean pause = false;
	BufferedImage telaPause;
	
	// 
	BufferedImage barra;
	BotaoSimples botaoNextWave;
	BotaoSimples botaoPause;
	BufferedImage telaInfo;
	// tela troca de wave
	// TODO Auto-generated method stub
	final int INICIO= 0;
	final int TROCA_WAVE = 1;
	final int JOGO = 2;
	final int DEBRIFING = 3;
	final int BUILDS_TORRES = 4;
	final int RESULTADO = 5;
	int faseJogo;
	int timerTrocaWave;
	//final int timerDeTrocaDeWave = 7000;
	int contadorTrocaWave;
	
	BotaoSimples botaoSkipTrocaWave;
	BufferedImage frase;
	int timerFrase;
	int tempoDeTimerDeFrase = 20000;
	TelaTorresLiberada telaBilds;
	BotaoSimples botaoBuildTorres;
	BotaoSimples botaoCloseBuilds;
	
	BufferedImage imageNulaTorre;
	int contadorTempoResultado;
	final int delayResultado = 2300;
	boolean winWave;
	BufferedImage waveWin;
	final BufferedImage nextWaveDesabilitada;
	
	// bruno dia 02/12
	int totalInimigos;
	int totalInimigosMortos;
	int totalDeTorreCriadas;
	int totalDeTorresDestroidas;
	final BufferedImage telaDebriefing;
	int valorBonusInimigos = 50;
	int valorBonusTorres = 60;
	int valorBonusCastelo = 100;
	BotaoSimples botaoCloseDebriefing;
	boolean estadoAnteriorSom;
	static BufferedImage buffer = null;
	boolean recompensaPaga;


	public TelaJogo(int X, int Y, int Width, int Height, String fileNome) {
		super(X, Y, Width, Height, fileNome);

		frase = Utilidades.LoadImage("/dicas/frase.png");
		telaInfo = Utilidades.LoadImage("/telas/tela_entre_waves.png");
		barra = Utilidades.LoadImage("/telas/barra_inferior.png");
		botaoNextWave = new BotaoSimples(550, 482, "/botoes/botao_next_wave.png", "/botoes/botao_next_wave_over.png");
		botaoPause = new BotaoSimples(50, 482, "/botoes/botao_pause.png", "/botoes/botao_pause_over.png");
		painelLateral = new PainelDeGerenciamento(720, -2, 182, 502, "/painel.png");
		//		inicializaArrayTorre();
		inicializaTudo();
		
		telaBriefing = Utilidades.LoadImage("/telas/tela_briefing.png");
		botaoSkipTrocaWave = new BotaoSimples(680, 5, "/botoes/botao_exit.png", "/botoes/botao_exit_over.png");
		botaoSkipBriefing = new BotaoSimples(820, 5, "/botoes/botao_exit.png", "/botoes/botao_exit_over.png");
		botaoEstadoSom = new BotaoDeEstado(10, 485, "/botoes/icone_som_on.png", "/botoes/icone_som_off.png");
		/**
		 * inicializando endereco de imagens que vao ser mostra
		 * no inicio de cada fase e juntamente com a paisagem corespondente
		 * 
		 */
		telaPause = Utilidades.LoadImage("/telas/tela_pause.png");
		listaDeEndNomesFases = new String [4]; 
		listaDeEndNomesFases[0] = "/telas/Dorus.png";
		listaDeEndNomesFases[1] = "/telas/Xuthus.png";
		listaDeEndNomesFases[2] = "/telas/Kiana.png";
		listaDeEndNomesFases[3] = "/telas/Alka.png";
		listaDeEndImagemDeFases = new String[4];
		listaDeEndImagemDeFases[0] = "/telas/floresta.png";
		listaDeEndImagemDeFases[1] = "/telas/deserto.png";
		listaDeEndImagemDeFases[2] = "/telas/planicie 2.png";
		listaDeEndImagemDeFases[3] = "/telas/geleira.png";
		listaDeImagemDeFases = new BufferedImage[4];
		listaDeNomeDeFases = new BufferedImage[4];
		for(int i=0; i<listaDeEndImagemDeFases.length; i++){
			listaDeImagemDeFases[i]=Utilidades.LoadImage(listaDeEndImagemDeFases[i]);
			listaDeNomeDeFases[i]=Utilidades.LoadImage(listaDeEndNomesFases[i]);
		}
		telaBilds = new TelaTorresLiberada(0, 0, 900, 500, "/telas/builds_torres.png");
		botaoBuildTorres = new BotaoSimples(300, 482, "/botoes/botao_build_torre.png", "/botoes/botao_build_torre_over.png");
		botaoCloseBuilds = new BotaoSimples(820, 5, "/botoes/botao_exit.png", "/botoes/botao_exit_over.png");
		imageNulaTorre = Utilidades.LoadImage("/torres/x.png");
		waveWin = Utilidades.LoadImage("/dicas/wave_winner.png");
		nextWaveDesabilitada = Utilidades.LoadImage("/botoes/botao_next_wave_off.png");
		GamePanel.money = GamePanel.moneyInicial;
		//
		telaDebriefing = Utilidades.LoadImage("/telas/debriefing.png");
		botaoCloseDebriefing = new BotaoSimples(820, 5, "/botoes/botao_exit.png", "/botoes/botao_exit_over.png");
		
	}
	public void inicializaTudo(){
		listasDeTorres = new ArrayList<Tower>();
		listasDeTorres.clear();
		gerenciadorDeTorreCriada = new GerenciadorDeTorres();
		inicializaSprites();
		Constantes.ListaInimigos = new ArrayList<Enemy>();
		liberouWave = false;
		timerBriefing = 0;
		lifeBase = 50;
		indiceTorreSelecionada =-1;
		valorTorreParaVenda =0;
		valorTorreReparo = 0;
		pause = false;
		inicializaTorreBasica();
		inicializaSprites();
	
		resetaSelecao();
		resetaSelecaoTorreFixada();
		resetaSelecaoTorreNoCenario();

		
		faseJogo = INICIO;
		timerTrocaWave =0;		 
		contadorTrocaWave =0;
		timerFrase =0;
		winWave = false;
		contadorTempoResultado =0;
		totalInimigos =0;
		totalInimigosMortos =0;
		totalDeTorreCriadas =0 ;
		totalDeTorresDestroidas =0;
		recompensaPaga = false;


	}



	public void inicializaTorreBasica(){
		//		PainelLateral.prontoPraVenda = true;
		if(Constantes.mapaAtual<4){
		torreBasica =  new Tower(Constantes.listaDePosicoesIniciais.get(Constantes.mapaAtual).x, 
				Constantes.listaDePosicoesIniciais.get(Constantes.mapaAtual).y, 32, 32, 0);
		}
	}

	public void inicializaSprites(){
		listaDeSprites = new ArrayList<Sprite>();
		for(int i = 0; i<9; i++){
			listaDeSprites.add(new Sprite(736+((i%3)*25), 232+((i/3)*25), 25, 25, null, false));
		}
	}


	int valorFinal;
	@Override
	public void Draw(Graphics2D dbg) {
		anterior = dbg.getFont();
		switch (faseJogo) {
		case INICIO:
			dbg.drawImage(telaBriefing, 0, 0, null);
			dbg.drawImage(listaDeNomeDeFases[Constantes.mapaAtual-1], 436, 20, null);
			dbg.drawImage(listaDeImagemDeFases[Constantes.mapaAtual-1], 505, 136, null);
			dbg.drawImage(Constantes.listaDeBuildsTorres.get(telaBilds.quantidadeDetorresLiberada-3), 103, 150, null);
			dbg.drawImage(Constantes.listaDeBuildsTorres.get(telaBilds.quantidadeDetorresLiberada-2), 191, 150, null);
			dbg.drawImage(Constantes.listaDeBuildsTorres.get(telaBilds.quantidadeDetorresLiberada-1), 279, 150, null);
		
		
			botaoSkipBriefing.Draw(dbg);
			break;
		case TROCA_WAVE:
			
			dbg.setFont(fontTrocaWave);
			dbg.drawImage(telaInfo, 0, 0, null);
			dbg.drawImage(listaDeNomeDeFases[Constantes.mapaAtual-1], 260, 30, null);
			dbg.setColor(Color.WHITE);
			dbg.drawString(""+(Constantes.listaMapas.get(Constantes.mapaAtual).waveAtual+1)+" - "+Constantes.listaMapas.get(Constantes.mapaAtual).listaWaves.size(), 180, 210);
//			dbg.drawString(""+Constantes.listaMapas.get(Constantes.mapaAtual).quantidadeTotalInimigos, 190, 390);
			dbg.drawString(""+Constantes.ListaInimigos.size(), 190, 390);
			dbg.setFont(font);
			painelLateral.Draw(dbg);
			dbg.setColor(Color.RED);
			dbg.drawString(""+lifeBase, 770, 15);
			botaoSkipTrocaWave.Draw(dbg);
			dbg.drawImage(barra, 0, 480, null);
			dbg.drawImage(nextWaveDesabilitada, botaoNextWave.x, botaoNextWave.y, null);
			botaoNextWave.Draw(dbg);
			botaoEstadoSom.Draw(dbg);
			botaoPause.Draw(dbg);
		
			break;
		case JOGO:
			
			dbg.setFont(font);
//			Constantes.listaMapas.get(Constantes.mapaAtual).DesenhaSe(dbg);
//			dbg.drawImage(Constantes.listaDeImagemCenario.get(Constantes.mapaAtual), 0, 0, null);
			if (buffer == null){
				criaBuffer();
			} else {
				dbg.drawImage(buffer, 0, 0, null);
			}
			
			if (liberouWave) {
				for (int i = 0; i < Constantes.ListaInimigos.size(); i++) {
					Constantes.ListaInimigos.get(i).DesenhaSe(dbg);
				}
			}
			painelLateral.Draw(dbg);
			dbg.setColor(Color.RED);
			dbg.drawString(""+lifeBase, 770, 15);
			for (int i = 0; i < listasDeTorres.size(); i++) {
				listasDeTorres.get(i).Draw(dbg);

			}		
			for(int j =0; j<listaDeSprites.size(); j++){
				if(listaDeSprites.get(j).selecionado){
					dbg.drawImage(listaDeSprites.get(j).imagem, listaDeSprites.get(j).x,listaDeSprites.get(j).y, null);
				}
			}		
			if(materialSelecionado!=null){			
				dbg.drawImage(materialSelecionado, mouseX-(materialSelecionado.getWidth()/2), mouseY-(materialSelecionado.getHeight()/2), null);
			}
			


			if(torre!=null){
				
				dbg.drawImage(torre.imagemDemonstracao, 736, 310, null);
				dbg.setColor(Color.WHITE);
				dbg.drawString(""+torre.life, 821, 260);
				dbg.drawString(""+(torre.damage+torre.bonusAtaque), 821, 297);
				dbg.drawString(""+(torre.range+torre.bonusRange), 821, 335);
				dbg.drawString(""+torre.custo, 821, 370);
			}
			if(indiceTorreSelecionada!=-1){		
				painelLateral.torreSelecionada = true;
				if(listasDeTorres.get(indiceTorreSelecionada).selecionadoNoCenario){
				
					dbg.drawImage(listasDeTorres.get(indiceTorreSelecionada).imagemDemonstracao, 736, 310, null);
					dbg.setColor(Color.WHITE);
					dbg.drawString(""+listasDeTorres.get(indiceTorreSelecionada).life, 821, 260);
					dbg.drawString(""+(listasDeTorres.get(indiceTorreSelecionada).damage+listasDeTorres.get(indiceTorreSelecionada).bonusAtaque), 821, 297);
					dbg.drawString(""+(listasDeTorres.get(indiceTorreSelecionada).range+listasDeTorres.get(indiceTorreSelecionada).bonusRange), 821, 335);
					
					dbg.setColor(Color.RED);
					dbg.drawString(""+valorTorreReparo, 805, 478);
					dbg.drawString(""+valorTorreParaVenda, 805, 450);

				}
			}else{
				
					
				
				painelLateral.torreSelecionada = false;
			}
			if(torre == null && indiceTorreSelecionada==-1 ){
				dbg.drawImage(imageNulaTorre, 736, 310, null);
			}
			dbg.drawImage(barra, 0, 480, null);
			dbg.drawImage(nextWaveDesabilitada, botaoNextWave.x, botaoNextWave.y, null);
			
			if (!liberouWave){
				botaoNextWave.Draw(dbg);
			}
			
			botaoEstadoSom.Draw(dbg);
			botaoPause.Draw(dbg);
			//TODO
			botaoBuildTorres.Draw(dbg);
			
		
			break;
		
		case BUILDS_TORRES:
			telaBilds.Draw(dbg);
			botaoCloseBuilds.Draw(dbg);
			break;
		case DEBRIFING: 
			// total 
			anterior = dbg.getFont();
			dbg.setFont(fontTrocaDebriefing);
			dbg.drawImage(telaDebriefing, 0, 0, null);
			dbg.drawString(""+totalInimigos, 575, 185);
			dbg.drawString(""+totalInimigosMortos, 575, 220);
			dbg.drawString(""+totalDeTorreCriadas, 575, 245);
			
			dbg.drawString(""+(totalDeTorresDestroidas), 575, 275);
			dbg.drawString(""+lifeBase, 575, 305);
			// bonus
			valorFinal = 0;
			//dbg.drawString(""+totalInimigos, 715, 185);
			if(totalInimigosMortos== totalInimigos){
				dbg.drawString(""+valorBonusInimigos, 715, 220);
				valorFinal+=valorBonusInimigos;
			}
			//dbg.drawString(""+totalDeTorreCriadas, 715, 245);
			if(listasDeTorres.size()== totalDeTorreCriadas){
				dbg.drawString(""+valorBonusTorres, 715, 275);
				valorFinal+=valorBonusTorres;
			}
			if(lifeBase == lifeBaseMax){
				dbg.drawString(""+valorBonusCastelo, 715, 305);
				valorFinal+=valorBonusCastelo;
			}
			dbg.drawString(""+valorFinal, 620, 380);
			if(!recompensaPaga){
				recompensaPaga = true;
				GamePanel.money += valorFinal;
			}
			botaoCloseDebriefing.Draw(dbg);
			dbg.setFont(anterior);
			// falta o valor final mais tem que aumentar a letra da fonte
			break;
		case RESULTADO:
			dbg.drawImage(buffer, 0, 0, null);
			painelLateral.Draw(dbg);
			for (int i = 0; i < listasDeTorres.size(); i++) {
				listasDeTorres.get(i).Draw(dbg);

			}		
			for(int j =0; j<listaDeSprites.size(); j++){
				if(listaDeSprites.get(j).selecionado){
					dbg.drawImage(listaDeSprites.get(j).imagem, listaDeSprites.get(j).x,listaDeSprites.get(j).y, null);
				}
			}		
			if(materialSelecionado!=null){			
				dbg.drawImage(materialSelecionado, mouseX-(materialSelecionado.getWidth()/2), mouseY-(materialSelecionado.getHeight()/2), null);
			}
			dbg.setColor(Color.RED);
			dbg.drawString(""+lifeBase, 770, 15);


			if(torre!=null){
				
				dbg.drawImage(torre.imagemDemonstracao, 736, 310, null);
				dbg.setColor(Color.WHITE);
				dbg.drawString(""+torre.life, 821, 260);
				dbg.drawString(""+(torre.damage+torre.bonusAtaque), 821, 297);
				dbg.drawString(""+(torre.range+torre.bonusRange), 821, 335);
				dbg.drawString(""+torre.custo, 821, 370);
			}else{
				dbg.drawImage(imageNulaTorre, 736, 310, null);
			}
			
			dbg.drawImage(barra, 0, 480, null);
			dbg.drawImage(nextWaveDesabilitada, botaoNextWave.x, botaoNextWave.y, null);
			if (liberouWave) {
				for (int i = 0; i < Constantes.ListaInimigos.size(); i++) {
					Constantes.ListaInimigos.get(i).DesenhaSe(dbg);
				}
			}else{
				botaoNextWave.Draw(dbg);
			}
			
			botaoEstadoSom.Draw(dbg);
			botaoPause.Draw(dbg);
			botaoBuildTorres.Draw(dbg);
			
			if(winWave){
				dbg.drawImage(waveWin, 235, 165, null);
			}
			break;
		
		}
		if(pause){
			dbg.drawImage(telaPause, 0, 0, null);
		}
		dbg.setFont(anterior);

	}

	@SuppressWarnings("static-access")
	@Override
	public void Update(long diffTime) {
		if(!pause){	
			switch (faseJogo) {
			case INICIO:
				
				if( botaoSkipBriefing.selecionada){
					timerBriefing =0;
					botaoSkipBriefing.mouseOver = false;
					botaoSkipBriefing.selecionada = false;
					faseJogo = TROCA_WAVE;
					
					
				
				}
				break;
			case TROCA_WAVE:
						
				if(botaoSkipTrocaWave.selecionada){
					timerTrocaWave =0;		
					totalInimigos += Constantes.ListaInimigos.size();				
					botaoSkipTrocaWave.selecionada = false;
					botaoSkipTrocaWave.mouseOver = false;
					torre =null;
					valor=0;					
					resetaSelecao();
					inicializaSprites();
					resetaSelecaoTorreNoCenario();
					faseJogo = JOGO;
					
				}
				break;
			case JOGO:
//				testaBotoes();
//				CriaTorre();

				if (liberouWave) {
					for (int i = 0; i < Constantes.ListaInimigos.size(); i++) {
						Constantes.ListaInimigos.get(i).SimulaSe(diffTime);
						if (!Constantes.ListaInimigos.get(i).vivo) {
							if(!Constantes.ListaInimigos.get(i).isSuicidio){
								GamePanel.money= GamePanel.money+Constantes.ListaInimigos.get(i).recompensa;
//								System.out.println("recomensa que ta passando tela jogo "+Constantes.ListaInimigos.get(i).recompensa);
								totalInimigosMortos++;
							}
							Constantes.ListaInimigos.remove(i);
							if (Constantes.ListaInimigos.size()==0){
								liberouWave = false;
								if(lifeBase>0){
									winWave = true;
								}
								faseJogo = RESULTADO;
								Constantes.listaMapas.get(Constantes.mapaAtual).waveAtual++;
								
								if (Constantes.listaMapas.get(Constantes.mapaAtual).waveAtual<Constantes.listaMapas.get(Constantes.mapaAtual).listaWaves.size()){
									Constantes.listaMapas.get(Constantes.mapaAtual).carregaWave(Constantes.listaMapas.get(Constantes.mapaAtual).waveAtual);
								} else{		
									totalDeTorresDestroidas +=totalDeTorreCriadas-listasDeTorres.size();
									faseJogo = DEBRIFING;				
													
									
								}
							}
						}
					}
				}
				
				for (int j = 0; j < listasDeTorres.size(); j++) {
					if (listasDeTorres.get(j).fixada) {
						if (listasDeTorres.get(j).viva){
							listasDeTorres.get(j).Update(diffTime);
						} else {
							if(j == indiceTorreSelecionada)
								indiceTorreSelecionada =-1;
							listasDeTorres.remove(j);
						}
					}
				}
				break;
			case RESULTADO:
				contadorTempoResultado+=diffTime;
				
				if(contadorTempoResultado>delayResultado){
					contadorTempoResultado = 0;
					winWave = false;
					faseJogo = TROCA_WAVE;
					
				}
				break;
			}
			// end switch
			if(lifeBase<1){
				inicializaTudo();				
				GamePanel.instance.TELA_ATIVA = GamePanel.instance.TELA_GAME_OVER;
				limpaBuffer();
				//TODO
				Constantes.soundplayer.Stop();
				Constantes.soundplayer.playTrack(Constantes.BGM_TELA_GAME_OVER);
			}
		}
	}

	public void testaBotoes(){
		if(auxX>720){
			// testa os botoes do Painel e realiza a funcao de acordo do que foi determinado 
			if(painelLateral.botaoConfirm.selecionada){
				materialSelecionado = null;
				painelLateral.botaoConfirm.selecionada = false;
				painelLateral.botaoTorre.selecionada = false;
				if(torre!=null){
					
					if(GamePanel.money-torre.custo>-1){
						criaTorreBasica(torre);
						totalDeTorreCriadas++;
						//TODO
						//valor=0;
						//torre = null;
					
						resetaSelecao();
						//inicializaSprites();
						resetaSelecaoTorreNoCenario();						
					}else{
						Constantes.soundplayer.playTrack(Constantes.SFX_PUNCH);
					}

				}
			}
			if(painelLateral.botaoTorre.selecionada){
				inicializaTorreBasica();
				valor=0;
				torre = torreBasica;
				
				materialSelecionado = null;
				inicializaSprites();
				resetaSelecaoTorreFixada();				

			}
			if(painelLateral.botaoCancel.selecionada){
				valor=0;
				painelLateral.botaoCancel.selecionada = false;
				resetaSelecao();
				inicializaSprites();
				resetaSelecaoTorreNoCenario();

			}

			if(painelLateral.botaoMadeira.selecionada){
				tipoMaterial = gerenciadorDeTorreCriada.MADEIRA;
				materialSelecionado = painelLateral.botaoMadeira.imagemNormal;			
				painelLateral.botaoMadeira.selecionada= false;		
				resetaSelecaoTorreFixada();

			}

			if(painelLateral.botaoPedra.selecionada){
				tipoMaterial = gerenciadorDeTorreCriada.PEDRA;
				materialSelecionado = painelLateral.botaoPedra.imagemNormal;			
				painelLateral.botaoPedra.selecionada= false;	
				resetaSelecaoTorreFixada();

			}

			if(painelLateral.botaoMetal.selecionada){
				tipoMaterial = gerenciadorDeTorreCriada.METAL;
				materialSelecionado = painelLateral.botaoMetal.imagemNormal;			
				painelLateral.botaoMetal.selecionada= false;
				resetaSelecaoTorreFixada();

			}

			if(painelLateral.botaoSell.selecionada){
				
				removeTorre();
				totalDeTorresDestroidas --;
				painelLateral.botaoSell.selecionada = false;
				//				Constantes.soundplayer.mute = !Constantes.soundplayer.mute;
				Constantes.soundplayer.playTrack(Constantes.SFX_SELL);
				resetaSelecaoTorreNoCenario();
			}
			if(painelLateral.botaoRepair.selecionada){

				if(indiceTorreSelecionada!=-1){
					if(GamePanel.money-valorTorreReparo>-1){
						if(listasDeTorres.get(indiceTorreSelecionada).life<listasDeTorres.get(indiceTorreSelecionada).lifeMax){
							GamePanel.money-=valorTorreReparo;
							reparaTorre(indiceTorreSelecionada);
							resetaSelecaoTorreNoCenario();
						}
					}

				}
				painelLateral.botaoRepair.selecionada = false;


			}
		}
	}

	private void reparaTorre(int indice) {

		listasDeTorres.get(indice).constroiTorre(listasDeTorres.get(indice).tipoDaTorre);		
	}

	public void CriaTorre(){
		int resultado =gerenciadorDeTorreCriada.testaTorre(valor);	
	
		if(resultado!=-1){			
			torre =  new Tower(Constantes.listaDePosicoesIniciais.get(Constantes.mapaAtual).x, 
					Constantes.listaDePosicoesIniciais.get(Constantes.mapaAtual).y, 32, 32, resultado);
			}else{
			if(torre!=torreBasica){

				torre = null;
			}			
		}
	}

	public void resetaSelecaoTorreNoCenario(){
		for(int i=0; i<listasDeTorres.size(); i++){
			listasDeTorres.get(i).selecionadoNoCenario = false;
		}
	}

	public void resetaSelecao(){
		torre = null;
		materialSelecionado = null;
		tipoMaterial = -1;
	}

	@SuppressWarnings("static-access")
	@Override
	public void tratadorTecladoPress(KeyEvent e) {

		int keyCode = e.getKeyCode();

		switch (keyCode) {
		case KeyEvent.VK_ENTER:
			if(!pause){
				if(faseJogo == BUILDS_TORRES){
					faseJogo = JOGO;
				}else{
					if(faseJogo == JOGO){
						faseJogo = BUILDS_TORRES;
					}
				}
			}
			break;
		case KeyEvent.VK_ESCAPE:
			inicializaTudo();
			GamePanel.reiniciaFasesTreino = true;
			listasDeTorres.clear();
			GamePanel.instance.TELA_ATIVA = GamePanel.instance.TELA_INICIAL;

			break;
		case KeyEvent.VK_1:
			//			Constantes.soundplayer.playTrack(0);
			break;
		case KeyEvent.VK_2:
			//			Constantes.soundplayer.playTrack(1);
			break; 
		case KeyEvent.VK_3:
			//			Constantes.soundplayer.playTrack(2);
			break;
		case KeyEvent.VK_4:
			//			Constantes.soundplayer.playTrack(3);
			break;
		case KeyEvent.VK_W:
			break;
		}
	}

	@Override
	public void tratadorTecladoReleased(KeyEvent e) {
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		botaoPause.mouseMoved(e);
		if(!pause){
			switch (faseJogo) {
			case INICIO:
				botaoSkipBriefing.mouseMoved(e);
				break;
			case TROCA_WAVE:
				botaoSkipTrocaWave.mouseMoved(e);
				break;
			case JOGO:	

				painelLateral.mouseMoved(e);
				botaoEstadoSom.mouseMoved(e);
				botaoNextWave.mouseMoved(e);
				botaoBuildTorres.mouseMoved(e);
				auxX = e.getX();
				auxY = e.getY();
				testeDeMouseDentroDoPainel(auxX, auxY);
				for (int i = 0; i < listasDeTorres.size(); i++) {
					listasDeTorres.get(i).mouseMove(e);
				}
				break;
			case DEBRIFING:
				botaoCloseDebriefing.mouseMoved(e);
			break;
			case BUILDS_TORRES:
				telaBilds.mouseMoved(e);
				botaoCloseBuilds.mouseMoved(e);
				break;
			
			}
		}
	}

	@Override
	public void mouseDragged(MouseEvent e) {
//		botaoPause.mouseDragged(e);
//		if(!pause){
//			switch (faseJogo) {
//			case INICIO:
//				botaoSkipBriefing.mouseMoved(e);
//				break;
//			case TROCA_WAVE:
//				botaoSkipTrocaWave.mouseMoved(e);
//				break;
//			case JOGO:
//				botaoNextWave.mouseDragged(e);
//				botaoEstadoSom.mouseDragged(e);
//				botaoBuildTorres.mouseDragged(e);
//				auxX = e.getX();
//				auxY = e.getY();
//				testeDeMouseDentroDoPainel(auxX, auxY);
//
//				for (int i = 0; i < listasDeTorres.size(); i++) {
//					listasDeTorres.get(i).mouseMove(e);
//				}
//				break;
//			case BUILDS_TORRES:
//				botaoCloseBuilds.mouseMoved(e);
//				break;
//			
//			}
//			
//		}

	}

	public void testeDeMouseDentroDoPainel(int auxX,int auxY){
		if(auxX>733 && auxX<888){
			if(auxY>12 && auxY<488){
				mouseX = auxX;
				mouseY = auxY;
				if(Utilidades.ColisaoRetangular(720, 48, 900, 387, mouseX, mouseY, mouseX+1, mouseY+1)){

					mouseOverGrid = true;
				}else{
					if(mouseOverGrid){
						liberaMaterialSelecionado();
						mouseOverGrid = false;
					}
				}
			}else{
				materialSelecionado = null;
			}
		}else{
			materialSelecionado = null;
		}
	}

	@Override
	public void mouseReleased(MouseEvent e) {


	}

	@Override
	public void mousePressed(MouseEvent e) {
		
	}

	@Override
	public void mouseExited(MouseEvent e) {

	}

	@Override
	public void mouseEntered(MouseEvent e) {


	}

	@SuppressWarnings("static-access")
	@Override
	public void mouseClicked(MouseEvent e) {
		botaoPause.mouseClicked(e);
		if(botaoPause.selecionada){
			botaoPause.selecionada = false;
//			botaoPause.mouseOver = false;
			pause = !pause;
		}
		if(!pause){
			switch (faseJogo) {
			case INICIO:
				botaoSkipBriefing.mouseClicked(e);
				break;
			case DEBRIFING:
				botaoCloseDebriefing.mouseClicked(e);
		
				if(botaoCloseDebriefing.selecionada){
					botaoCloseDebriefing.selecionada = false;
					inicializaTudo();					
					Constantes.mapaAtual ++;
					limpaBuffer();
					telaBilds.quantidadeDetorresLiberada+=3;
					if(Constantes.mapaAtual>4){
						inicializaTudo();
						telaBilds.quantidadeDetorresLiberada =3;
						Constantes.mapaAtual = 2;
						limpaBuffer();
						GamePanel.reiniciaFasesTreino = true;						
						//TODO
						// mudar 
						Constantes.soundplayer.Stop(Constantes.BGM_WAVE_ESPERA);
						Constantes.soundplayer.playTrack(Constantes.BGM_TELA_WIN);
						GamePanel.instance.TELA_ATIVA = GamePanel.instance.TELA_GAME_WIN;
						break;
						
					}else{
						faseJogo = INICIO;
					
						lifeBase = lifeBaseMax;
						recuperaValorDaTorres();
						Constantes.listaMapas.get(Constantes.mapaAtual).carregaWave(Constantes.listaMapas.get(Constantes.mapaAtual).waveAtual);
						
					}	
					
				}
				break;
			case TROCA_WAVE:
				botaoSkipTrocaWave.mouseClicked(e);
				break;
			case JOGO:
				if(indiceTorreSelecionada!=-1){
					if(e.getX()<720){
						resetaSelecaoTorreFixada();
						painelLateral.botaoCancel.selecionada = false;
						
					}
				}
				estadoAnteriorSom = botaoEstadoSom.selecionada;
				botaoEstadoSom.mouseClicked(e);
				if(botaoEstadoSom.selecionada){
					Constantes.soundplayer.Stop();
				}
				if(estadoAnteriorSom){
					if(!botaoEstadoSom.selecionada){
						Constantes.soundplayer.playTrack(Constantes.BGM_WAVE_ESPERA);
						
					}
				}
				botaoNextWave.mouseClicked(e);
				botaoBuildTorres.mouseClicked(e);
				if(botaoBuildTorres.selecionada){
					faseJogo = BUILDS_TORRES;
					botaoBuildTorres.selecionada = false;
					botaoBuildTorres.mouseOver = false;
				}
				if(botaoNextWave.selecionada){
					botaoNextWave.selecionada = false;
					if(!liberouWave){
						Constantes.soundplayer.playTrack(Constantes.SFX_LIBERA_WAVE);
						liberouWave = true;
					}
				}
				int indice = -1;
				
				painelLateral.mouseClicked(e);
				for (int i = 0; i < listasDeTorres.size(); i++) {
					listasDeTorres.get(i).mouseClik(e);
					if(listasDeTorres.get(i).selecionadoNoCenario){
						//resetaSelecaoTorreNoCenario();
						indice = i;
					}
				}
				if(indice!=-1){

					listasDeTorres.get(indice).selecionadoNoCenario = true;
				}

				atualizaGrid();
				getIndiceTorreSelecionada();
			
				break;
			case BUILDS_TORRES:
				botaoCloseBuilds.mouseClicked(e);
				if(botaoCloseBuilds.selecionada){
					faseJogo = JOGO;
					botaoCloseBuilds.selecionada = false;
					botaoCloseBuilds.mouseOver = false;
				}
				break;
			
			}
				
				
		}
		CriaTorre();
		testaBotoes();
	}

	@Override
	public void setaOpcao(int opcao) {


	}

	public void criaTorreBasica(Tower tower){
		/** Verifica se tem alguma torre para ser colocada no mapa
		 * se tiver alguma torre ele nao deixa ser criada outra ate que aquela seja 
		 * fixada e depois faz o debito deacordo com o valor de custo da torre.
		 * e adciona na lista de torres 
		 */
		boolean autorizado = true;
		for(int i =0; i<listasDeTorres.size(); i++){
			if(listasDeTorres.get(i).fixada == false){
				autorizado = false;
				break;
			}		
		}
		if(autorizado){
			GamePanel.money-=tower.custo;
			//			PainelLateral.diminuiMoney(tower.custo);

			listasDeTorres.add(tower);
			torre= null;

		}
	}

	public void  getIndiceTorreSelecionada(){
		indiceTorreSelecionada = -1;
		for(int i=0; i<listasDeTorres.size(); i++){
			if(listasDeTorres.get(i).selecionadoNoCenario){
				valorTorreParaVenda = (int) (listasDeTorres.get(i).custo*(listasDeTorres.get(i).life/listasDeTorres.get(i).lifeMax)*0.9f);
				
				valorTorreReparo = (int)(listasDeTorres.get(i).custo*0.7);

				indiceTorreSelecionada= i;
				valor=0;
				torre = null;
				inicializaSprites();
				break;
			}
		}
	}

	public void removeTorre(){

		if(indiceTorreSelecionada!=-1){
			GamePanel.money +=valorTorreParaVenda;
			//			PainelLateral.aumentaMoney(valorTorreParaVenda);
			listasDeTorres.remove(indiceTorreSelecionada);
			indiceTorreSelecionada =-1;
		}
	}

	public void atualizaGrid(){
		/**
		 * vai verificar se tem algum material selecionado e qual posicao esta tentando colocar material 
		 * 
		 */
		if(tipoMaterial!=-1){
			// teste para ferificar se esta dentro dos grides para economizar testes
			if(mouseOverGrid){
				testaColisaoComSprite();
			}
		}
	}

	public void testaColisaoComSprite(){	
		// TODO
		for (int i = 0; i<listaDeSprites.size(); i++) {
			Sprite sprite  =  listaDeSprites.get(i);
			if(!sprite.selecionado){
				if(Utilidades.ColisaoRetangular(sprite.x, sprite.y, sprite.x+sprite.width, sprite.y+sprite.height,
						mouseX, mouseY, mouseX+1, mouseY+1)){
					
					somaTermos(i, tipoMaterial);
					listaDeSprites.get(i).imagem = materialSelecionado;
					listaDeSprites.get(i).selecionado = true;						
					break;							

				}
			}				
		}	
	}

	public void somaTermos(int quantidade, int material){
		int valorTemp =1;
		if(quantidade==0){
			valorTemp = 1;
		}else{
			for(int j=0; j<quantidade; j++){
				valorTemp *=10;

			}
		}	
		
		valor += valorTemp*material;
		//System.out.println("Valor "+valor);
		

	}



	public void liberaMaterialSelecionado(){
		materialSelecionado = null;			
		painelLateral.botaoPedra.selecionada= false;
		painelLateral.botaoMadeira.selecionada = false;
		painelLateral.botaoMetal.selecionada = false;

	}

	public void resetaSelecaoTorreFixada(){
		for (int i = 0; i < listasDeTorres.size(); i++) {			
			listasDeTorres.get(i).selecionadoNoCenario = false;			
		}
	}

	public void recuperaValorDaTorres(){
		
		for (int i = 0; i < listasDeTorres.size(); i++) {
			GamePanel.money+=listasDeTorres.get(i).custo;

		}
		listasDeTorres = new ArrayList<Tower>();

	}

	public void criaBuffer(){
    	buffer = new BufferedImage(GamePanel.PWIDTH, GamePanel.PHEIGHT, BufferedImage.TYPE_INT_RGB);
    	Graphics2D dbg = buffer.createGraphics();
    	dbg.drawImage(Constantes.listaDeImagemCenario.get(Constantes.mapaAtual), 0, 0, null);         
    }

	public void limpaBuffer(){
		buffer = null;
	}
	
	public static void adicionaSangueNoBuffer(int x, int y){
		if (buffer != null){
			Graphics2D dbg = buffer.createGraphics();
			dbg.drawImage(Constantes.sangue, x, y, null);
		}
	}
	
	public static void adicionaChamuscadoNoBuffer(int x, int y) {
		if (buffer != null) {
			Graphics2D dbg = buffer.createGraphics();
			dbg.drawImage(Constantes.chamuscado, x, y, null);
		}
	}
}
